
package jp.ize.iwp.utils;

// {{{ prepares
#if flash9
import flash.events.EventDispatcher;
#elseif (flash||js)
import jp.ize.iwp.avm1.events.EventDispatcher;
#end

typedef HandlerInfo = {
	handler:Void->Void,
	waitingFlag:Bool
}
// }}}

/**
* SceneManager クラスです。<br />
* 一連の処理の流れを制御するためのクラスです。
*/
class SceneManager extends EventDispatcher
{
	// {{{ properties

	public var handlerInfos:Array<HandlerInfo>;

	// }}}
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super();
		handlerInfos = new Array();
	}

	// }}}
	// {{{ public function addNextHandler( handler:Void->Void, ?waitingFlag:Bool ) : Void
	/**
	* 処理を登録します。
	* waitingFlag が true の場合は、next() が呼出されるまで次の処理に移行しません。
	* waitingFlag が false の場合は、処理が終了すると自動的に next() が呼出され、次々と処理を完了していきます。
	*/
	public function addNextHandler( handler:Void->Void, ?waitingFlag:Bool ) : Void
	{
		if ( waitingFlag==null ) waitingFlag = false;
		handlerInfos.push({handler:handler,waitingFlag:waitingFlag});
	}

	// }}}
	// {{{ public function begin() : Void
	/**
	* 処理を開始します。
	*/
	public function begin() : Void
	{
		//trace("begin");
		next();
	}

	// }}}
	// {{{ public function next() : Void
	/**
	* 次の処理に移行します。
	*/
	public function next() : Void
	{
		//trace("next");
		if ( handlerInfos.length>0 ) {
			var handlerInfo:HandlerInfo = handlerInfos.shift();
			handlerInfo.handler();
			if ( !handlerInfo.waitingFlag ) {
				next();
			}
		} else {
			end();
		}
	}

	// }}}
	// {{{ public function end() : Void
	/**
	* 予約関数のため利用されません
	* （将来、終了を通知するために使われる可能性があります）
	*/
	public function end() : Void
	{
		//trace("end");
	}

	// }}}
}
